Amazon EC2(Linux)のネットワーク設定でハマったときに見るメモ
ども、大瀧です。
LinuxのEC2インスタンスでちょっと変わったネットワーク設定をしようとすると、思う通りに動かなかったり設定が見えなかったりと、オンプレミスとは雰囲気の異なる振る舞いをすることがあります(本質的にはオンプレミスとなんら変わらないのですが)。自身で経験したケースをメモ書きとして残しておきます。
- 想定するLinux OS : Amazon Linux, CentOS 6.x, RHEL 6.xなどRed Hat系ディストリビューション
/etc/resolv.confを変更したのになぜか元に戻ってしまう
DHCPクライアントによるものです。DHCPクライアントは定期的にIPアドレス更新の問い合わせをDHCPサーバーに行いますが、そのときに付随するDNSの情報を元にデフォルトで/etc/resolv.confファイルを上書きします。これを無効にするためにNICの設定ファイル/etc/sysconfig/network-scripts/ifcfg-eth0のPEERDNSオプションをnoに設定します。
/etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0 BOOTPROTO=dhcp ONBOOT=yes TYPE=Ethernet USERCTL=yes PEERDNS=no IPV6INIT=no PERSISTENT_DHCLIENT=yes
設定を反映するために、networkサービスを再起動しましょう。
[ec2-user@ip-172-31-XX-XXX ~]$ sudo service network restart Shutting down interface eth0: [ OK ] Shutting down loopback interface: [ OK ] Bringing up loopback interface: [ OK ] Bringing up interface eth0: Determining IP information for eth0... done. [ OK ] [ec2-user@ip-172-31-XX-XXX ~]$
セカンダリIPアドレスを設定したのに見えない
Amazon Linuxでは、ENI(EC2の仮想NIC)にセカンダリIPアドレスを設定するとec2-net-utilsが自動でIPアドレスを付与してくれます。しかし、ec2-net-utilsによるアドレスの付与はiproute2ベースのため、ifconfigコマンドではアドレスが表示されません。ip addrコマンドを利用しましょう。
[ec2-user@ip-172-31-19-207 ~]$ ifconfig eth0 eth0 Link encap:Ethernet HWaddr 0A:C9:D2:45:A2:EE inet addr:172.31.19.207 Bcast:172.31.31.255 Mask:255.255.240.0 inet6 addr: fe80::8c9:d2ff:fe45:a2ee/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:9001 Metric:1 RX packets:53935 errors:0 dropped:0 overruns:0 frame:0 TX packets:27534 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:65519252 (62.4 MiB) TX bytes:2625041 (2.5 MiB) Interrupt:72 [ec2-user@ip-172-31-19-207 ~]$
[ec2-user@ip-172-31-19-207 ~]$ ip addr show eth0 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc pfifo_fast state UP qlen 1000 link/ether 0a:c9:d2:45:a2:ee brd ff:ff:ff:ff:ff:ff inet 172.31.19.207/20 brd 172.31.31.255 scope global eth0 valid_lft forever preferred_lft forever inet 172.31.26.80/20 brd 172.31.31.255 scope global secondary eth0 valid_lft forever preferred_lft forever inet6 fe80::8c9:d2ff:fe45:a2ee/64 scope link valid_lft forever preferred_lft forever [ec2-user@ip-172-31-19-207 ~]$
ENI(EC2の仮想NIC)を追加したのに通信できない
EC2インスタンスに2つ目のENIを追加したのにそのENIのIPアドレスにpingやsshしても応答がない、というケースです。いろいろな原因がありますが、インスタンスとリモートホストとのルーティングが不適切な場合が多いです。Primary ENIとSecondary ENIで異なるサブネットをまたぐ場合、既定ではeth0のゲートウェイにデフォルトルートが向くため、eth1では他のサブネットやインターネットとの通信ができません。ifcfg-ethXファイルのDEFROUTE=noでデフォルトルート無しと選択できるので、ifcfg-eth0に追加(デフォルトルート無し)、ifcfg-eth1から削除(こちらにデフォルトルートを向ける)など、調節しましょう。
/etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1 BOOTPROTO=dhcp ONBOOT=yes TYPE=Ethernet USERCTL=yes PEERDNS=no IPV6INIT=no PERSISTENT_DHCLIENT=yes HWADDR=0a:45:a7:69:b3:49 DEFROUTE=no EC2SYNC=yes
設定の反映は、一度インスタンスを再起動するのが確実です。
デフォルトゲートウェイの選択だけでは対応できない場合、iproute2のポリシーベースルーティングという手も使えます。以下のURLを参考にしてください。
ただ、EC2のENI追加はハマりポイントのるつぼなので、まずは本当にENIが必要なのか?IPアドレスの追加ならeth0へのセカンダリIP追加で代用できないかなど見直していただくことをお奨めします。
まとめ
いずれもちょっとしたことですが、EC2のドキュメントでは触れていなかったところだと思うので、誰かのお役に立てれば嬉しいです。